#ifndef CORE_PLAYERARRAY_H_
#define CORE_PLAYERARRAY_H_

#include "./Player.h"

#define MAX_PLAYERS 16

namespace Core {

/*
 * Przechowuje tabele graczy. Id gracza odpowiada geo pozycji w tablicy graczy. Nalezy
 * przy tym pamietac, iz id gracza nie jest tozsame z id obiektu sterowanego przez gracza.
 */
class PlayerArray {
	Player* players_[ MAX_PLAYERS ];

	/* Numer gracza, ktory kontroluje lokalna maszyna. */
	unsigned char local_player_;

	PlayerArray();

	~PlayerArray();

public:

	static unsigned char INVALID_ID;

	static PlayerArray& getInstance() {
		static PlayerArray instance;
		return instance;
	}

	/*
	 * Zwraca niezajety identyfikator gracza, lub INVALID_ID, jesli nie ma juz wolnych miejsc w
	 * tablicy graczy.
	 */
	unsigned char getUniquePlayerId();

	/*
	 * Czysci tablice graczy.
	 */
	void clear();

	/*
	 * Dodaje gracza do listy graczy na zadanej pozycji. Uwaga! Istnieje mozliwosc nadpisania
	 * zajetej pozycji, wiec nalezy zatroszczyc sie, aby taka sytuacja nie miala miejsca.
	 */
	void addPlayer( unsigned char id, Player* player ) {
		players_[ id ] = player;
	}

	/*
	 * Pobiera gracza o zadnym id.
	 */
	Player* getPlayer( unsigned char id ) {
		return players_[ id ];
	}

	/*
	 * Pobiera obiekt gracza, nad ktorym kontrole sprawuje lokalna maszyna.
	 */
	Player* getLocalPlayer() {
		return getPlayer( local_player_ );
	}

	/*
	 * Pobiera id gracza, nad ktorym kontrole sprawuje lokalna maszyna.
	 */
	unsigned char getLocalPlayerId() {
		return local_player_;
	}

	/*
	 * Oznacza gracza o podanym id jako gracza kontrolowanego przez lokalna maszyne.
	 */
	void setLocalPlayerById( int id ) {
		local_player_ = id;
	}

}; //class PlayerArray

} //namespace Core

#endif /* CORE_PLAYERARRAY_H_ */
